package com.carhailing.consumer;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 支付补偿
 */
@Component
public class MyConsumer {
   @Autowired
   private RedisTemplate redisTemplate;

   //   侦听器       要声明的队列       , 可写多个
   @RabbitListener(queuesToDeclare = {@Queue("queue")})   // 通道
   public void bb(String string, Message message, Channel channel) {
      // 获取ID添加到set集合（不可重复）
      String uuid = message.getMessageProperties().getMessageId();
      try {
         Long i = redisTemplate.opsForSet().add("key1", uuid);
         if (i > 0) {
            System.out.println(string);
            // 不回退消息
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            // uuid存入缓存， 上面判断 缓存包含id说明已经消费过了，不用set，因为不能设置过期时间，会占用内存
//            redisTemplate.opsForValue().set(smsParamsVo.getMessageId(), smsParamsVo.getMessageId(), 12, TimeUnit.MINUTES);
         }
      } catch (IOException e) {
         // 删除 id缓存
         redisTemplate.opsForSet().remove("key1", uuid);
         try {
            // 回退消息
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
            // channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
         } catch (IOException ex) {
            System.out.println("回退失败  网络 异常");
         }
      }
   }

}
